package com.herench.bs.transfer;

import org.apache.cxf.endpoint.Client;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 复印病历预约查询
 *
 * @author liuxiaohui
 * @date 2019/3/26
 */
public class GetAppointMedPrintTransfer extends AbstractTransfer {
    public GetAppointMedPrintTransfer(String method, Client client, String messageMethod) {
        super(method, client, messageMethod);
    }

    /**
     * 发送：微信前端JSON数据转换为HIS用的XML数据（微信前端==》HIS）
     * @param params
     * @return
     * @throws Exception
     */
    @Override
    public String toInvokeMessage(Map<String, Object> params) throws Exception {
        // 身份证号
        String idNo = (String) params.get("idNo");
        // 住院号
        String inpNo = (String) params.get("inpNo");
        // 住院次数
        String visitId = (String) params.get("visitId");
        // 患者姓名
        String patientName = (String) params.get("patientName");
        // 患者ID
        String patientId = (String) params.get("patientId");
        // 收件人姓名
        String recipientName = (String) params.get("recipientName");
        // 收件人电话
        String recipientPhoneNumber = (String) params.get("recipientPhoneNumber");
        // 预约状态
        String appointStatus = (String) params.get("appointStatus");
        // 开始日期
        String startDate = (String) params.get("startDate");
        // 结束日期
        String endDate = (String) params.get("endDate");


        // 交易ID：his的方法名
        Document document = getTplDoc(getMethod());

        // 将各个入参数设值（入参==》XML）
        Element dataRow = document.getRootElement().element("CommitData").addElement("Data").addElement("DataRow");
        // 身份证号
        dataRow.addAttribute("ID_NO", idNo);
        // 住院号
        dataRow.addAttribute("INP_NO", inpNo);
        // 住院次数
        dataRow.addAttribute("VISIT_ID", visitId);
        // 患者姓名
        dataRow.addAttribute("PATIENT_NAME", patientName);
        // 患者ID
        dataRow.addAttribute("PATIENT_ID", patientId);
        // 收件人姓名
        dataRow.addAttribute("RECIPIENT_NAME", recipientName);
        // 收件人电话
        dataRow.addAttribute("RECIPIENT_PHONE_NUMBER", recipientPhoneNumber);
        // 预约状态
        dataRow.addAttribute("APPOINT_STATUS", appointStatus);
        // 开始日期
        dataRow.addAttribute("START_DATE", startDate);
        // 结束日期
        dataRow.addAttribute("END_DATE", endDate);


        return document.asXML();
    }

    /**
     * 接收：HIS返回的XML数据并转换为JSON（HIS==》微信前端）
     * @param resMsg
     * @return
     * @throws Exception
     */
    @Override
    public Map<String, Object> toResultMessage(String resMsg) throws Exception {
        Map<String, Object> resMap = new HashMap<>(16);
        Document document = DocumentHelper.parseText(resMsg);

        Element resultInfo = document.getRootElement().element("Result").element("Info");
        String executeStatus = resultInfo.attributeValue("EXECUTE_STATUS");
        String executeMessage = resultInfo.attributeValue("EXECUTE_MESSAGE");
        List<Map<String, Object>> dataList = new ArrayList<>();

        if (Dialect.getSuccessfulState().equals(executeStatus)) {
            // 获取各个参数的值（出参的树状结构：父==》子）
            // 取得数据为数组形式
            List<Element> dataRowList = document.getRootElement().element("ReturnData").element("Data").elements();

            if (dataRowList == null || dataRowList.size() == 0) {
                resMap.put("code", "1403");
                resMap.put("message", "调用成功，但是获取的数据为 0 件！");
            } else {
                for (Element dataRow : dataRowList) {
                    Map<String, Object> subMap = new HashMap<>(16);
                    GetAppointMedPrintInnerMessage innerMessage = new GetAppointMedPrintInnerMessage(dataRow);

                    // 复印病历预约ID
                    subMap.put("medAppId", innerMessage.getMedAppId());
                    // 住院号
                    subMap.put("inpNo", innerMessage.getInpNo());
                    // 入院次数
                    subMap.put("visitId", innerMessage.getVisitId());
                    // 患者姓名
                    subMap.put("patientName", innerMessage.getPatientName());
                    // 性别
                    subMap.put("sex", innerMessage.getSex());
                    // 身份证号
                    subMap.put("idNo", innerMessage.getIdNo());
                    // 患者身份证正面照片数据流
                    resMap.put("idCardFrontImage", innerMessage.getIdCardFrontImage());
                    // 患者身份证背面照片数据流
                    resMap.put("idCardBehindImage", innerMessage.getIdCardBehindImage());
                    // 患者电话
                    subMap.put("phoneNumber", innerMessage.getPhoneNumber());
                    // 代办人姓名
                    subMap.put("agentName", innerMessage.getAgentName());
                    // 代办人与患者关系
                    subMap.put("agentRelationship", innerMessage.getAgentRelationship());
                    // 代办人身份证号
                    subMap.put("agentIdNo", innerMessage.getAgentIdNo());
                    // 代办人身份证正面照片数据流
                    resMap.put("agentIdCardFrontImage", innerMessage.getAgentIdCardFrontImage());
                    // 代办人身份证背面照片数据流
                    resMap.put("agentIdCardBehindImage", innerMessage.getAgentIdCardBehindImage());
                    // 代办人电话
                    subMap.put("agentPhoneNumber", innerMessage.getAgentPhoneNumber());
                    // 病历类型
                    subMap.put("medClass", innerMessage.getMedClass());
                    // 病历套餐编码(复印用途)
                    subMap.put("medPlanCode", innerMessage.getMedPlanCode());
                    // 复印用途描述
                    subMap.put("printPurposeDesc", innerMessage.getPrintPurposeDesc());
                    // 复印份数
                    subMap.put("printNum", innerMessage.getPrintNum());
                    // 套餐张数
                    subMap.put("pages", innerMessage.getPages());
                    // 复印单价
                    subMap.put("printFee", innerMessage.getPrintFee());
                    // 复印其他费用
                    subMap.put("printOtherFee", innerMessage.getPrintOtherFee());
                    // 应收总费用
                    subMap.put("totalCharge", innerMessage.getTotalCharge());
                    // 备注
                    subMap.put("memo", innerMessage.getMemo());
                    // 领取方式
                    subMap.put("postWay", innerMessage.getPostWay());
                    // 支付方式
                    subMap.put("payWay", innerMessage.getPayWay());
                    // 收件人姓名
                    subMap.put("recipientName", innerMessage.getRecipientName());
                    // 收件人与患者关系
                    subMap.put("relationship", innerMessage.getRelationship());
                    // 收件地址
                    subMap.put("postAddr", innerMessage.getPostAddr());
                    // 收件人电话
                    subMap.put("recipientPhoneNumber", innerMessage.getRecipientPhoneNumber());
                    // 卡号
                    subMap.put("cardNo", innerMessage.getCardNo());
                    // 卡类型
                    subMap.put("cardType", innerMessage.getCardType());
                    // 支付金额
                    subMap.put("paymentAmount", innerMessage.getPaymentAmount());
                    // 支付类别
                    subMap.put("moneyType", innerMessage.getMoneyType());
                    // 流水号
                    subMap.put("streamNo", innerMessage.getStreamNo());
                    // 批次号
                    subMap.put("batchCode", innerMessage.getBatchCode());
                    // 授权码
                    subMap.put("authorizationCode", innerMessage.getAuthorizationCode());
                    // 终端编号
                    subMap.put("terminalNumber", innerMessage.getTerminalNumber());
                    // 银行编码
                    subMap.put("bankCode", innerMessage.getBankCode());
                    // 银行名称
                    subMap.put("bankName", innerMessage.getBankName());
                    // 参考号
                    subMap.put("reference", innerMessage.getReference());
                    // 预约状态
                    subMap.put("appointStatus", innerMessage.getAppointStatus());
                    // 预约状态名称
                    subMap.put("appointStatusName", innerMessage.getAppointStatusName());
                    // 预约时间
                    subMap.put("appointDateTime", innerMessage.getAppointDateTime());
                    // 预约操作人
                    subMap.put("appointOperator", innerMessage.getAppointOperator());
                    // 取消预约时间
                    subMap.put("appointCancelDateTime", innerMessage.getAppointCancelDateTime());
                    // 取消预约操作人
                    subMap.put("appointCancelOperator", innerMessage.getAppointCancelOperator());
                    // 审批时间
                    subMap.put("checkDateTime", innerMessage.getCheckDateTime());
                    // 审批人
                    subMap.put("checkOperator", innerMessage.getCheckOperator());
                    // 打印时间
                    subMap.put("printDateTime", innerMessage.getPrintDateTime());
                    // 打印操作人
                    subMap.put("printOperator", innerMessage.getPrintOperator());
                    // 邮寄时间
                    subMap.put("postDateTime", innerMessage.getPostDateTime());
                    // 邮寄操作人
                    subMap.put("postOperator", innerMessage.getPostOperator());
                    // 邮寄公司名称
                    subMap.put("expressName", innerMessage.getExpressName());
                    // 快递单号
                    subMap.put("expressNumber", innerMessage.getExpressNumber());

                    // 追加一行数据到List
                    dataList.add(subMap);
                }

                // 返回所有行数据
                resMap.put("dataList", dataList);


                // 返回Code
                resMap.put("code", executeStatus);
                // 返回信息
                resMap.put("message", "成功！");
            }
        } else {
            resMap.put("code", executeStatus);
            resMap.put("message", executeMessage);
        }
        return resMap;
    }

    public class GetAppointMedPrintInnerMessage implements InnerMessage{
        /**
         * 复印病历预约ID
         */
        private String medAppId;
        /**
         * 住院号
         */
        private String inpNo;
        /**
         * 入院次数
         */
        private String visitId;
        /**
         * 患者姓名
         */
        private String patientName;
        /**
         * 性别
         */
        private String sex;
        /**
         * 身份证号
         */
        private String idNo;
        /**
         * 患者身份证正面照片数据流
         */
        private String idCardFrontImage;
        /**
         * 患者身份证背面照片数据流
         */
        private String idCardBehindImage;
        /**
         * 患者电话
         */
        private String phoneNumber;
        /**
         * 代办人姓名
         */
        private String agentName;
        /**
         * 代办人与患者关系
         */
        private String agentRelationship;
        /**
         * 代办人身份证号
         */
        private String agentIdNo;
        /**
         * 代办人身份证正面照片数据流
         */
        private String agentIdCardFrontImage;
        /**
         * 代办人身份证背面照片数据流
         */
        private String agentIdCardBehindImage;
        /**
         * 代办人电话
         */
        private String agentPhoneNumber;
        /**
         * 病历类型
         */
        private String medClass;
        /**
         * 病历套餐编码(复印用途)
         */
        private String medPlanCode;
        /**
         * 复印用途描述
         */
        private String printPurposeDesc;
        /**
         * 复印份数
         */
        private String printNum;
        /**
         * 套餐张数
         */
        private String pages;
        /**
         * 复印单价
         */
        private String printFee;
        /**
         * 复印其他费用
         */
        private String printOtherFee;
        /**
         * 应收总费用
         */
        private String totalCharge;
        /**
         * 备注
         */
        private String memo;
        /**
         * 领取方式
         */
        private String postWay;
        /**
         * 支付方式
         */
        private String payWay;
        /**
         * 收件人姓名
         */
        private String recipientName;
        /**
         * 收件人与患者关系
         */
        private String relationship;
        /**
         * 收件地址
         */
        private String postAddr;
        /**
         * 收件人电话
         */
        private String recipientPhoneNumber;
        /**
         * 卡号
         */
        private String cardNo;
        /**
         * 卡类型
         */
        private String cardType;
        /**
         * 支付金额
         */
        private String paymentAmount;
        /**
         * 支付类别
         */
        private String moneyType;
        /**
         * 流水号
         */
        private String streamNo;
        /**
         * 批次号
         */
        private String batchCode;
        /**
         * 授权码
         */
        private String authorizationCode;
        /**
         * 终端编号
         */
        private String terminalNumber;
        /**
         * 银行编码
         */
        private String bankCode;
        /**
         * 银行名称
         */
        private String bankName;
        /**
         * 参考号
         */
        private String reference;
        /**
         * 预约状态
         */
        private String appointStatus;
        /**
         * 预约状态名称
         */
        private String appointStatusName;
        /**
         * 预约时间
         */
        private String appointDateTime;
        /**
         * 预约操作人
         */
        private String appointOperator;
        /**
         * 取消预约时间
         */
        private String appointCancelDateTime;
        /**
         * 取消预约操作人
         */
        private String appointCancelOperator;
        /**
         * 审批时间
         */
        private String checkDateTime;
        /**
         * 审批人
         */
        private String checkOperator;
        /**
         * 打印时间
         */
        private String printDateTime;
        /**
         * 打印操作人
         */
        private String printOperator;
        /**
         * 邮寄时间
         */
        private String postDateTime;
        /**
         * 邮寄操作人
         */
        private String postOperator;
        /**
         * 邮寄公司名称
         */
        private String expressName;
        /**
         * 快递单号
         */
        private String expressNumber;





        public GetAppointMedPrintInnerMessage(Element element) {
            // 复印病历预约ID
            this.medAppId = element.attributeValue("MED_APP_ID");
            // 住院号
            this.inpNo = element.attributeValue("INP_NO");
            // 入院次数
            this.visitId = element.attributeValue("VISIT_ID");
            // 患者姓名
            this.patientName = element.attributeValue("PATIENT_NAME");
            // 性别
            this.sex = element.attributeValue("SEX");
            // 身份证号
            this.idNo = element.attributeValue("ID_NO");
            // 患者身份证正面照片数据流
            this.idCardFrontImage = element.attributeValue("ID_CARD_FRONT_IMAGE");
            // 患者身份证背面照片数据流
            this.idCardBehindImage = element.attributeValue("ID_CARD_BEHIND_IMAGE");
            // 患者电话
            this.phoneNumber = element.attributeValue("PHONE_NUMBER");
            // 代办人姓名
            this.agentName = element.attributeValue("AGENT_NAME");
            // 代办人与患者关系
            this.agentRelationship = element.attributeValue("AGENT_RELATIONSHIP");
            // 代办人身份证号
            this.agentIdNo = element.attributeValue("AGENT_ID_NO");
            // 代办人身份证背面照片数据流
            this.agentIdCardBehindImage = element.attributeValue("AGENT_ID_CARD_BEHIND_IMAGE");
            // 代办人身份证正面照片数据流
            this.agentIdCardFrontImage = element.attributeValue("AGENT_ID_CARD_FRONT_IMAGE");
            // 代办人电话
            this.agentPhoneNumber = element.attributeValue("AGENT_PHONE_NUMBER");
            // 病历类型
            this.medClass = element.attributeValue("MED_CLASS");
            // 病历套餐编码(复印用途)
            this.medPlanCode = element.attributeValue("MED_PLAN_CODE");
            // 复印用途描述
            this.printPurposeDesc = element.attributeValue("PRINT_PURPOSE_DESC");
            // 复印份数
            this.printNum = element.attributeValue("PRINT_NUM");
            // 套餐张数
            this.pages = element.attributeValue("PAGES");
            // 复印单价
            this.printFee = element.attributeValue("PRINT_FEE");
            // 复印其他费用
            this.printOtherFee = element.attributeValue("PRINT_OTHER_FEE");
            // 应收总费用
            this.totalCharge = element.attributeValue("TOTAL_CHARGE");
            // 备注
            this.memo = element.attributeValue("MEMO");
            // 领取方式
            this.postWay = element.attributeValue("POST_WAY");
            // 支付方式
            this.payWay = element.attributeValue("PAY_WAY");
            // 收件人姓名
            this.recipientName = element.attributeValue("RECIPIENT_NAME");
            // 收件人与患者关系
            this.relationship = element.attributeValue("RELATIONSHIP");
            // 收件地址
            this.postAddr = element.attributeValue("POST_ADDR");
            // 收件人电话
            this.recipientPhoneNumber = element.attributeValue("RECIPIENT_PHONE_NUMBER");
            // 卡号
            this.cardNo = element.attributeValue("CARD_NO");
            // 卡类型
            this.cardType = element.attributeValue("CARD_TYPE");
            // 支付金额
            this.paymentAmount = element.attributeValue("PAYMENT_AMOUNT");
            // 支付类别
            this.moneyType = element.attributeValue("MONEY_TYPE");
            // 流水号
            this.streamNo = element.attributeValue("STREAM_NO");
            // 批次号
            this.batchCode = element.attributeValue("BATCH_CODE");
            // 授权码
            this.authorizationCode = element.attributeValue("AUTHORIZATION_CODE");
            // 终端编号
            this.terminalNumber = element.attributeValue("TERMINAL_NUMBER");
            // 银行编码
            this.bankCode = element.attributeValue("BANK_CODE");
            // 银行名称
            this.bankName = element.attributeValue("BANK_NAME");
            // 参考号
            this.reference = element.attributeValue("REFERENCE");
            // 预约状态
            this.appointStatus = element.attributeValue("APPOINT_STATUS");
            // 预约状态名称
            this.appointStatusName = element.attributeValue("APPOINT_STATUS_NAME");
            // 预约时间
            this.appointDateTime = element.attributeValue("APPOINT_DATE_TIME");
            // 预约操作人
            this.appointOperator = element.attributeValue("APPOINT_OPERATOR");
            // 取消预约时间
            this.appointCancelDateTime = element.attributeValue("APPOINT_CANCEL_DATE_TIME");
            // 取消预约操作人
            this.appointCancelOperator = element.attributeValue("APPOINT_CANCEL_OPERATOR");
            // 审批时间
            this.checkDateTime = element.attributeValue("CHECK_DATE_TIME");
            // 审批人
            this.checkOperator = element.attributeValue("CHECK_OPERATOR");
            // 打印时间
            this.printDateTime = element.attributeValue("PRINT_DATE_TIME");
            // 打印操作人
            this.printOperator = element.attributeValue("PRINT_OPERATOR");
            // 邮寄时间
            this.postDateTime = element.attributeValue("POST_DATE_TIME");
            // 邮寄操作人
            this.postOperator = element.attributeValue("POST_OPERATOR");
            // 邮寄公司名称
            this.expressName = element.attributeValue("EXPRESS_NAME");
            // 快递单号
            this.expressNumber = element.attributeValue("EXPRESS_NUMBER");
        }

        /**
         * 复印病历预约ID
         */
        public String getMedAppId() {
            return medAppId;
        }
        /**
         * 住院号
         */
        public String getInpNo() {
            return inpNo;
        }
        /**
         * 入院次数
         */
        public String getVisitId() {
            return visitId;
        }
        /**
         * 患者姓名
         */
        public String getPatientName() {
            return patientName;
        }
        /**
         * 性别
         */
        public String getSex() {
            return sex;
        }
        /**
         * 身份证号
         */
        public String getIdNo() {
            return idNo;
        }
        /**
         * 患者身份证正面照片数据流
         */
        public String getIdCardFrontImage() {
            return idCardFrontImage;
        }
        /**
         * 患者身份证背面照片数据流
         */
        public String getIdCardBehindImage() {
            return idCardBehindImage;
        }
        /**
         * 患者电话
         */
        public String getPhoneNumber() {
            return phoneNumber;
        }
        /**
         * 代办人姓名
         */
        public String getAgentName() {
            return agentName;
        }
        /**
         * 代办人与患者关系
         */
        public String getAgentRelationship() {
            return agentRelationship;
        }
        /**
         * 代办人身份证号
         */
        public String getAgentIdNo() {
            return agentIdNo;
        }
        /**
         * 代办人身份证正面照片数据流
         */
        public String getAgentIdCardFrontImage() {
            return agentIdCardFrontImage;
        }
        /**
         * 代办人身份证背面照片数据流
         */
        public String getAgentIdCardBehindImage() {
            return agentIdCardBehindImage;
        }
        /**
         * 代办人电话
         */
        public String getAgentPhoneNumber() {
            return agentPhoneNumber;
        }
        /**
         * 病历类型
         */
        public String getMedClass() {
            return medClass;
        }
        /**
         * 病历套餐编码(复印用途)
         */
        public String getMedPlanCode() {
            return medPlanCode;
        }
        /**
         * 复印用途描述
         */
        public String getPrintPurposeDesc() {
            return printPurposeDesc;
        }
        /**
         * 复印份数
         */
        public String getPrintNum() {
            return printNum;
        }
        /**
         * 套餐张数
         */
        public String getPages() {
            return pages;
        }
        /**
         * 复印单价
         */
        public String getPrintFee() {
            return printFee;
        }
        /**
         * 复印其他费用
         */
        public String getPrintOtherFee() {
            return printOtherFee;
        }
        /**
         * 应收总费用
         */
        public String getTotalCharge() {
            return totalCharge;
        }
        /**
         * 备注
         */
        public String getMemo() {
            return memo;
        }
        /**
         * 领取方式
         */
        public String getPostWay() {
            return postWay;
        }
        /**
         * 支付方式
         */
        public String getPayWay() {
            return payWay;
        }
        /**
         * 收件人姓名
         */
        public String getRecipientName() {
            return recipientName;
        }
        /**
         * 收件人与患者关系
         */
        public String getRelationship() {
            return relationship;
        }
        /**
         * 收件地址
         */
        public String getPostAddr() {
            return postAddr;
        }
        /**
         * 收件人电话
         */
        public String getRecipientPhoneNumber() {
            return recipientPhoneNumber;
        }
        /**
         * 卡号
         */
        public String getCardNo() {
            return cardNo;
        }
        /**
         * 卡类型
         */
        public String getCardType() {
            return cardType;
        }
        /**
         * 支付金额
         */
        public String getPaymentAmount() {
            return paymentAmount;
        }
        /**
         * 支付类别
         */
        public String getMoneyType() {
            return moneyType;
        }
        /**
         * 流水号
         */
        public String getStreamNo() {
            return streamNo;
        }
        /**
         * 批次号
         */
        public String getBatchCode() {
            return batchCode;
        }
        /**
         * 授权码
         */
        public String getAuthorizationCode() {
            return authorizationCode;
        }
        /**
         * 终端编号
         */
        public String getTerminalNumber() {
            return terminalNumber;
        }
        /**
         * 银行编码
         */
        public String getBankCode() {
            return bankCode;
        }
        /**
         * 银行名称
         */
        public String getBankName() {
            return bankName;
        }
        /**
         * 参考号
         */
        public String getReference() {
            return reference;
        }
        /**
         * 预约状态
         */
        public String getAppointStatus() {
            return appointStatus;
        }
        /**
         * 预约状态名称
         */
        public String getAppointStatusName() {
            return appointStatusName;
        }
        /**
         * 预约时间
         */
        public String getAppointDateTime() {
            return appointDateTime;
        }
        /**
         * 预约操作人
         */
        public String getAppointOperator() {
            return appointOperator;
        }
        /**
         * 取消预约时间
         */
        public String getAppointCancelDateTime() {
            return appointCancelDateTime;
        }
        /**
         * 取消预约操作人
         */
        public String getAppointCancelOperator() {
            return appointCancelOperator;
        }
        /**
         * 审批时间
         */
        public String getCheckDateTime() {
            return checkDateTime;
        }
        /**
         * 审批人
         */
        public String getCheckOperator() {
            return checkOperator;
        }
        /**
         * 打印时间
         */
        public String getPrintDateTime() {
            return printDateTime;
        }
        /**
         * 打印操作人
         */
        public String getPrintOperator() {
            return printOperator;
        }
        /**
         * 邮寄时间
         */
        public String getPostDateTime() {
            return postDateTime;
        }
        /**
         * 邮寄操作人
         */
        public String getPostOperator() {
            return postOperator;
        }
        /**
         * 邮寄公司名称
         */
        public String getExpressName() {
            return expressName;
        }
        /**
         * 快递单号
         */
        public String getExpressNumber() {
            return expressNumber;
        }



    }
}
